/** Fichier définissant le "cube troué".
 *
 * Ce fichier contient la définition de la classe CubeTroue.
 *
 * @file CubeTroue.hpp
 * @author Johan "Solo" Luisier
 *
 * @date 2010
 */
#ifndef CUBETROUE_H
#define CUBETROUE_H

#include "Forme.hpp"

//#include "Coord.hpp"
//#include "Vecteur.hpp"

#include <iostream>

/** Classe implémentant le "cube troué" pour le raytracing.
 *
 * Cette classe implémente le "cube troué" pour le raytracing. Le "cube troué"
 * est une forme composée de cylindre de rayon variable placés sur les arrêtes
 * d'un cube.
 *
 * Il est défini dans un système de coordonnées local (dont l'origine est sur
 * un des sommets) et il possède un côté de longueur 1. En plus de la rotation,
 * il faut aussi définr un rapport d'homothétie.
 *
 * L'équation est bizarrement entièrement déterminée pour le moment. Il est
 * probablement possible de changer la valeur du coefficient de degré 0, ce qui
 * aurait comme effet de changer le rayon des "arrêtes".
 *
 * Forme::PseudoCentre est défini comme le centre de gravité du cube.
 *
 * @author Johan "Solo" Luisier
 * @date 2010
 *
 * @class CubeTroue "CubeTroue.hpp" "Formes/CubeTroue.hpp"
 */
class CubeTroue : public Forme
{
public:
    CubeTroue(const Coord& pt, const VecteurU& v1, const VecteurU& v2,
              const double& ratio = 1.);
    CubeTroue(const CubeTroue& cube);
    ~CubeTroue();
    Coord trouveIntersection(Rayon const &) const;
    VecteurU normale(Coord const &) const;
    bool estDans(Coord const &) const;
    bool estSur(Coord const&) const;
    void mapping(const Coord&, int&, int&, const int&, const int&, const int&)
    const;
    std::ostream& affiche(std::ostream& os) const;
    Coord intrinseque(const Coord& pt) const;
protected:
    /**
     * Un des sommets du cube, est utilisé comme origine pour le système
     * de coordonnées local.
     */
    Coord Coin;
};

#endif // CUBETROUE_H
